/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.scp.controlador.backingBean.BKArticuloKardex;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.ArticuloSedePK;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.KardexPK;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.to.KardexFisicoTO;
import pe.com.cotelasa.scp.to.KardexSaldoTO;
import pe.com.cotelasa.scp.to.KardexValorizadoTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBArticuloKardex")
@Scope("request")
public class MBArticuloKardex extends MBGenerico implements Serializable {

    @Inject
    private BKArticuloKardex bk;
    @Inject
    private IServicioKardex servicioKardex;
    @Inject
    private IServicioArticuloSede servicioStock;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioSede servicioSede;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Autowired
    BKSession session;

    public void buscarArticuloKardex() {

        try {
            bk.setListaKardex(servicioKardex.listaKardexPorFiltro(bk.getKardexBusqueda(), bk.getFechaInicio(), bk.getFechaFinal()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public String mostrarMantenimiento() {
        bk.setListaKardex(null);
        bk.setKardexBusqueda(new Kardex());
        bk.getKardexBusqueda().setId(new KardexPK());
        bk.getKardexBusqueda().getId().setIdArticulo(0);
        bk.getKardexBusqueda().getId().setIdSede(0);
        bk.getKardexBusqueda().getId().setIdEmpresa(session.getEmpresa().getId());
        bk.getKardexBusqueda().getId().setPartidaLote("");
        bk.setArticuloBusqueda(new Articulo());
        bk.getArticuloBusqueda().setDetalle("");
        bk.setIdCategoriaArticulo(0);
        bk.setIdSubCategoriaArticulo(0);
        bk.setListaSubCategoriaArticulo(null);
        try {
            bk.setListaCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasPadres());
        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
        bk.setListaSede(new ArrayList<Sede>());
        for (Sede sede : session.getEmpresa().getSedeCollection()) {
            if (sede.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && sede.getEsAlmacen() == 1) {
                bk.getListaSede().add(sede);
            }
        }

        return URLPaginacion.ArticuloKardex.URL_LISTA_ARTICULO_KARDEX;
    }

    public void marcarInicioBusqueda(DateSelectEvent event) {
        bk.setFechaInicio(event.getDate());
    }

    public void marcarFinalBusqueda(DateSelectEvent event) {
        bk.setFechaFinal(event.getDate());
    }

    public void buscarArticulos() {


        bk.getKardexBusqueda().getId().setIdArticulo(0);
        bk.getKardexBusqueda().getId().setPartidaLote("");

        listarArticulos(null);

    }

    public void listarArticulos(CategoriaArticulo cat) {
        try {
            bk.setListaArticulo(new ArrayList<Articulo>());
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK(session.getEmpresa().getId(), bk.getKardexBusqueda().getId().getIdSede(), 0, null));
            articuloSede.setArticulo(new Articulo());
            articuloSede.getArticulo().setIdCategoriaArticulo(cat);
            for (Object i : servicioStock.listaArticulosUnicosPorSede(articuloSede)) {
                bk.getListaArticulo().add(servicioArticulo.conseguirArticuloPorId((Integer) i));
            }
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void buscarPartidas() {
        bk.setListaPartida(new ArrayList<String>());
        bk.getKardexBusqueda().getId().setPartidaLote("");
        try {
            ArticuloSede articuloSede = new ArticuloSede();
            articuloSede.setId(new ArticuloSedePK());
            articuloSede.getId().setIdSede(bk.getKardexBusqueda().getId().getIdSede());
            articuloSede.getId().setIdArticulo(bk.getKardexBusqueda().getId().getIdArticulo());
            for (ArticuloSede articulo : servicioStock.listaPartidaPorSedeYArticulo(articuloSede)) {
                bk.getListaPartida().add(articulo.getPartidaLote());
            }

        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public String mostrarKardexVenta() {
        bk.setListaKardex(null);
        bk.setKardexBusqueda(new Kardex());
        bk.getKardexBusqueda().setId(new KardexPK());
        bk.getKardexBusqueda().getId().setIdArticulo(0);
        bk.getKardexBusqueda().getId().setIdSede(session.getSede().getId());
        bk.getKardexBusqueda().getId().setIdEmpresa(session.getEmpresa().getId());
        bk.getKardexBusqueda().getId().setPartidaLote("");

        buscarArticulos();

        return URLPaginacion.Ventas.URL_LISTA_KARDEX;
    }

    public void buscarSubCategorias() {
        try {
            if (bk.getIdCategoriaArticulo() != 0) {
                CategoriaArticulo cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bk.getIdCategoriaArticulo());
                bk.setListaSubCategoriaArticulo(servicioCategoriaArticulo.listarCategoriasHijos(cat));
                bk.getArticuloBusqueda().setIdCategoriaArticulo(cat);

                listarArticulos(cat);

            } else {
                bk.setListaSubCategoriaArticulo(null);
                bk.setIdSubCategoriaArticulo(0);
                bk.getArticuloBusqueda().setIdCategoriaArticulo(null);
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void seleccionarSubCategorias() {
        try {
            CategoriaArticulo cat = null;
            if (bk.getIdSubCategoriaArticulo() != null) {
                cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bk.getIdSubCategoriaArticulo());
                bk.getArticuloBusqueda().setIdCategoriaArticulo(cat);

                listarArticulos(cat);
            } else {
                cat = servicioCategoriaArticulo.conseguirCategoriaArticuloPorId(bk.getIdCategoriaArticulo());
                bk.getArticuloBusqueda().setIdCategoriaArticulo(cat);
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public String verKardexValorizado() {
        bk.getListaSedeReporte().clear();
        if (bk.getKardexBusqueda().getId().getIdSede() == 0) {
            for (Sede sede : session.getEmpresa().getSedeCollection()) {
                if (sede.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && sede.getEsAlmacen() == 1) {
                    bk.getListaSedeReporte().add(sede);
                }
            }
        } else {
            try {
                bk.getListaSedeReporte().add(servicioSede.conseguirSedePorId(bk.getKardexBusqueda().getId().getIdSede()));
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }
        bk.setSedeUsada(null);
        if (bk.getFechaInicio() == null && bk.getFechaFinal() == null) {
            bk.setFechaReporte("Al " + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() != null && bk.getFechaFinal() != null) {
            bk.setFechaReporte("Del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() == null) {
            bk.setFechaReporte("Al " + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaFinal() == null) {
            bk.setFechaReporte("Del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        }


        return URLPaginacion.ArticuloKardex.URL_KARDEX_VALORIZADO;
    }

    public Collection<KardexValorizadoTO> buscarMovKardexValorizado(Sede sede, Articulo articulo, String partida) {
        Collection<KardexValorizadoTO> listaMov = new ArrayList<KardexValorizadoTO>();
        bk.setCantSalidaPartida(BigDecimal.ZERO);
        bk.setCantEntradaPartida(BigDecimal.ZERO);
        bk.setTotalSalidaPartida(BigDecimal.ZERO);
        bk.setTotalEntradaPartida(BigDecimal.ZERO);

        /*System.out.println("sede : " + sede);
         System.out.println("articulo : " + articulo);
         System.out.println("partida : " + partida);*/
        Collection<Kardex> listaKardex = new ArrayList<Kardex>();
        try {
            Kardex kardexBusqueda = new Kardex();
            kardexBusqueda.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), articulo.getId(), 0, partida));
            listaKardex = servicioKardex.listaKardexPorFiltro(kardexBusqueda, bk.getFechaInicio(), bk.getFechaFinal());
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        int i = 0;
        for (Kardex kardex : listaKardex) {
            KardexValorizadoTO mov = new KardexValorizadoTO();
            if (i == 0) {
                i++;
                mov.setDocumento("INVENTARIO INICIAL");
                if (kardex.getId().getNuSecKardex() != 1) {
                    Kardex kardexB = new Kardex();
                    try {
                        kardexB.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), articulo.getId(), kardex.getId().getNuSecKardex() - 1, partida));
                        kardexB = servicioKardex.buscarKardex(kardexB);
                    } catch (ServiceException e) {
                        e.printStackTrace();
                    }
                    if (kardexB != null) {
                        mov.setFecha(kardexB.getFecMovimiento());
                        mov.setCantSaldo(kardexB.getCaStockFinal());
                        mov.setTotalSaldo(kardexB.getVaTotalInventario());
                        mov.setPrecioPromedio(kardexB.getVaCostoArticulo());
                    } else {
                        mov.setFecha(UtilitarioFecha.obtenerPrimerDiaMes(kardex.getFecMovimiento()));
                        mov.setCantSaldo(BigDecimal.ZERO);
                        mov.setTotalSaldo(BigDecimal.ZERO);
                        mov.setPrecioPromedio(BigDecimal.ZERO);
                    }

                    listaMov.add(mov);

                    mov = new KardexValorizadoTO();
                } else {
                    //mov.setNroDocumento("");
                    if (kardex.getIdGuiaRemision() == null && kardex.getIdVentaFacturacion() == null) {
                        mov.setFecha(kardex.getFecMovimiento());
                        mov.setCantSaldo(kardex.getCaStockFinal());
                        mov.setTotalSaldo(kardex.getVaTotalInventario());
                        mov.setPrecioPromedio(kardex.getVaCostoArticulo());
                        listaMov.add(mov);
                        continue;
                    } else {
                        mov.setFecha(UtilitarioFecha.obtenerPrimerDiaMes(kardex.getFecMovimiento()));
                        mov.setCantSaldo(BigDecimal.ZERO);
                        mov.setTotalSaldo(BigDecimal.ZERO);
                        mov.setPrecioPromedio(BigDecimal.ZERO);
                        listaMov.add(mov);
                    }
                    mov = new KardexValorizadoTO();

                }


            }

            mov.setFecha(kardex.getFecMovimiento());
            Integer tipo_comp = 0;

            if (kardex.getIdGuiaRemision() != null) {
                if (kardex.getIdGuiaRemision().getIdFactura() != null) {
                    mov.setNroDocumento(kardex.getIdGuiaRemision().getIdFactura().getSerie() + "-" + kardex.getIdGuiaRemision().getIdFactura().getNumeroFactura());
                    tipo_comp = kardex.getIdGuiaRemision().getIdFactura().getTipoCompPago();
                } else if (kardex.getIdGuiaRemision().getIdVentaFacturacion() != null) {
                    try {
                        VentaFacturacion venta = servicioVentaFacturacion.obtenerFacturacion(kardex.getIdGuiaRemision().getIdVentaFacturacion());
                        mov.setNroDocumento(venta.getSerieFactura() + "-" + venta.getNumFactura());
                        tipo_comp = venta.getTipoCompago();
                    } catch (ServiceException e) {
                        e.printStackTrace();
                    }
                } else {
                    mov.setNroDocumento(kardex.getIdGuiaRemision().getSerie() + "-" + kardex.getIdGuiaRemision().getNumeroGuia());
                    tipo_comp = kardex.getIdGuiaRemision().getTipoCompPago();
                }

                try {
                    mov.setDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorId(tipo_comp).getNombre());
                } catch (ServiceException e) {
                    e.printStackTrace();
                }

            } else if (kardex.getIdVentaFacturacion() != null) {
                if (kardex.getIdVentaFacturacion().getCoddocbase() == null && kardex.getIdVentaFacturacion().getTipoCompago() == TIPO_DOC_VENTA.GUIA.getValor()) {
                    mov.setNroDocumento(kardex.getIdVentaFacturacion().getSerieFactura() + "-" + kardex.getIdVentaFacturacion().getNumFactura());
                    tipo_comp = kardex.getIdVentaFacturacion().getTipoCompago();
                } else if (kardex.getIdVentaFacturacion().getCoddocbase() == null && kardex.getIdVentaFacturacion().getTipoCompago() != TIPO_DOC_VENTA.GUIA.getValor()) {
                    mov.setNroDocumento(kardex.getIdVentaFacturacion().getSerieFactura() + "-" + kardex.getIdVentaFacturacion().getNumFactura());
                    tipo_comp = kardex.getIdVentaFacturacion().getTipoCompago();
                } else if (kardex.getIdVentaFacturacion().getCoddocbase() != null) {
                    try {
                        VentaFacturacion venta = servicioVentaFacturacion.obtenerFacturacion(kardex.getIdVentaFacturacion().getCoddocbase());
                        mov.setNroDocumento(venta.getSerieFactura() + "-" + venta.getNumFactura());
                        tipo_comp = venta.getTipoCompago();
                    } catch (ServiceException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    mov.setDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorId(tipo_comp).getNombre());
                } catch (ServiceException e) {
                    e.printStackTrace();
                }
            } else {
                mov.setDocumento(kardex.getMotivo1().getDeCortaMotivo());
            }

            System.out.println("movimiento : "+kardex.getTiMovimiento());
            if (kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
                mov.setCantEntrada(kardex.getCaMovimiento());
                mov.setTotalEntrada(kardex.getVaCostoPromedio());

                bk.setCantEntradaPartida(bk.getCantEntradaPartida().add(mov.getCantEntrada()));
                bk.setTotalEntradaPartida(bk.getTotalEntradaPartida().add(mov.getTotalEntrada()));
                if(mov.getCantEntrada().doubleValue() != 0){
                mov.setPrecioEntrada(mov.getTotalEntrada().divide(mov.getCantEntrada(), MathContext.DECIMAL32));
                }else{
                    mov.setPrecioEntrada(mov.getTotalEntrada());
                }
            } else {
                mov.setCantSalida(kardex.getCaMovimiento().negate());
                mov.setTotalSalida(kardex.getVaCostoPromedio());
                System.out.println("cantidad salida partida : "+bk.getCantSalidaPartida());
                System.out.println("cantidad salida movimiento : "+mov.getCantSalida());
                bk.setCantSalidaPartida(bk.getCantSalidaPartida().add(mov.getCantSalida()));
                bk.setTotalSalidaPartida(bk.getTotalSalidaPartida().add(mov.getTotalSalida()));
                System.out.println("total saldida : "+mov.getTotalSalida());

                mov.setCostoSalida(mov.getTotalSalida().divide(mov.getCantSalida(), MathContext.DECIMAL32));
            }
            mov.setCantSaldo(kardex.getCaStockFinal());
            mov.setTotalSaldo(kardex.getVaTotalInventario());
            mov.setPrecioPromedio(kardex.getVaCostoArticulo());

            listaMov.add(mov);
        }
        if (!partida.equalsIgnoreCase(bk.getPartidaUsada())) {
            bk.setPartidaUsada(partida);
            bk.setCantEntradaArticulo(bk.getCantEntradaArticulo().add(bk.getCantEntradaPartida()));
            bk.setTotalEntradaArticulo(bk.getTotalEntradaArticulo().add(bk.getTotalEntradaPartida()));
            bk.setCantEntradaSede(bk.getCantEntradaSede().add(bk.getCantEntradaPartida()));
            bk.setTotalEntradaSede(bk.getTotalEntradaSede().add(bk.getTotalEntradaPartida()));

            bk.setCantSalidaArticulo(bk.getCantSalidaArticulo().add(bk.getCantSalidaPartida()));
            bk.setTotalSalidaArticulo(bk.getTotalSalidaArticulo().add(bk.getTotalSalidaPartida()));
            bk.setCantSalidaSede(bk.getCantSalidaSede().add(bk.getCantSalidaPartida()));
            bk.setTotalSalidaSede(bk.getTotalSalidaSede().add(bk.getTotalSalidaPartida()));


        }


        /*System.out.println("movimientos : " + listaMov);

         System.out.println("--------------------------------- Cambiar Articulo ---------------------------------------------------");*/
        return listaMov;
    }

    /**
     * ****************************** FIN KARDEX VALORIZADO
     * *****************************************
     */
    /**
     * ****************************** SALDO
     * *****************************************
     */
    public String verSaldo() {
        bk.getListaSedeReporte().clear();
        if (bk.getKardexBusqueda().getId().getIdSede() == 0) {
            for (Sede sede : session.getEmpresa().getSedeCollection()) {
                if (sede.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && sede.getEsAlmacen() == 1) {
                    bk.getListaSedeReporte().add(sede);
                }
            }
        } else {
            try {
                bk.getListaSedeReporte().add(servicioSede.conseguirSedePorId(bk.getKardexBusqueda().getId().getIdSede()));
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }
        bk.setSedeUsada(null);
        if (bk.getFechaInicio() == null && bk.getFechaFinal() == null) {
            bk.setFechaReporte("al " + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() != null && bk.getFechaFinal() != null) {
            bk.setFechaReporte("del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() == null) {
            bk.setFechaReporte("al " + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaFinal() == null) {
            bk.setFechaReporte("del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        }


        return URLPaginacion.ArticuloKardex.URL_KARDEX_SALDO;
    }

    public Collection<KardexSaldoTO> buscarMovimientoSaldo(Sede sede) {

        Collection<Articulo> listaArticulos = new ArrayList<Articulo>();
        Collection<KardexSaldoTO> listaKardexSaldo = new ArrayList<KardexSaldoTO>();

        BigDecimal inicioSede = BigDecimal.ZERO;
        BigDecimal entradaSede = BigDecimal.ZERO;
        BigDecimal salidaSede = BigDecimal.ZERO;
        BigDecimal saldoSede = BigDecimal.ZERO;

        BigDecimal inicioArt;
        BigDecimal entradaArt;
        BigDecimal salidaArt;
        String unidad = "";
        try {
            Kardex kardexBusqueda = new Kardex();
            kardexBusqueda.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), 0, 0, ""));
            kardexBusqueda.setArticulo(bk.getArticuloBusqueda());
            Collection<Kardex> listaKardexPorArticulo;
            listaArticulos = obtenerArticulos(servicioKardex.listaKardexPorFiltro(kardexBusqueda, bk.getFechaInicio(), bk.getFechaFinal()));
            for (Articulo articulo : listaArticulos) {
                kardexBusqueda.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), articulo.getId(), 0, ""));
                listaKardexPorArticulo = servicioKardex.listaKardexPorFiltro(kardexBusqueda, bk.getFechaInicio(), bk.getFechaFinal());
                String partida = null;

                inicioArt = BigDecimal.ZERO;
                entradaArt = BigDecimal.ZERO;
                salidaArt = BigDecimal.ZERO;

                for (Kardex kardex : listaKardexPorArticulo) {
                    if (!kardex.getPartidaLote().equals(partida)) {
                        partida = kardex.getPartidaLote();
                        unidad = kardex.getUnidadMedida().getAbrev();
                        inicioArt = inicioArt.add(kardex.getCaStockIncial());
                    }

                    if (kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
                        entradaArt = entradaArt.add(kardex.getCaMovimiento());

                    } else {
                        salidaArt = salidaArt.add(kardex.getCaMovimiento().negate());
                    }
                }

                KardexSaldoTO kardesSaldo = new KardexSaldoTO();
                kardesSaldo.setArticulo(articulo.getNombreComercial());
                kardesSaldo.setUnidad(unidad);
                kardesSaldo.setInicio(inicioArt);
                kardesSaldo.setEntrada(entradaArt);
                kardesSaldo.setSalida(salidaArt);
                kardesSaldo.setSaldo(inicioArt.add(entradaArt).subtract(salidaArt));

                listaKardexSaldo.add(kardesSaldo);

                inicioSede = inicioSede.add(inicioArt);
                entradaSede = entradaSede.add(entradaArt);
                salidaSede = salidaSede.add(salidaArt);
                saldoSede = inicioSede.add(entradaSede).subtract(salidaSede);
            }

        } catch (ServiceException e) {
            e.printStackTrace();
        }

        if (!sede.equals(bk.getSedeUsada())) {
            bk.setSedeUsada(sede);
            bk.setEntradaSede(entradaSede);
            bk.setInicioSede(inicioSede);
            bk.setSalidaSede(salidaSede);
            bk.setSaldoSede(saldoSede);
        }

        return listaKardexSaldo;
    }

    /**
     * ********************************* FIN KARDEX SALDO
     * *********************************************
     */
    /**
     * ********************************* INICIO KARDEX FISICO
     * *****************************************
     */
    public String verKardexFisico() {
        bk.getListaSedeReporte().clear();
        if (bk.getKardexBusqueda().getId().getIdSede() == 0) {
            for (Sede sede : session.getEmpresa().getSedeCollection()) {
                if (sede.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor() && sede.getEsAlmacen() == 1) {
                    bk.getListaSedeReporte().add(sede);
                }
            }
        } else {
            try {
                bk.getListaSedeReporte().add(servicioSede.conseguirSedePorId(bk.getKardexBusqueda().getId().getIdSede()));
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }
        bk.setSedeUsada(null);
        if (bk.getFechaInicio() == null && bk.getFechaFinal() == null) {
            bk.setFechaReporte("Al " + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() != null && bk.getFechaFinal() != null) {
            bk.setFechaReporte("Del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaInicio() == null) {
            bk.setFechaReporte("Al " + UtilitarioFecha.formatearFecha(bk.getFechaFinal(), "dd MMMM yyyy").toUpperCase());
        } else if (bk.getFechaFinal() == null) {
            bk.setFechaReporte("Del " + UtilitarioFecha.formatearFecha(bk.getFechaInicio(), "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase());
        }


        return URLPaginacion.ArticuloKardex.URL_KARDEX_FISICO;
    }

    public Collection<KardexFisicoTO> buscarMovKardexFisico(Sede sede, Articulo articulo, String partida) {
        Collection<KardexFisicoTO> listaMov = new ArrayList<KardexFisicoTO>();
        bk.setCantSalidaPartida(BigDecimal.ZERO);
        bk.setCantEntradaPartida(BigDecimal.ZERO);

        Collection<Kardex> listaKardex = new ArrayList<Kardex>();
        try {
            Kardex kardexBusqueda = new Kardex();
            kardexBusqueda.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), articulo.getId(), 0, partida));
            listaKardex = servicioKardex.listaKardexPorFiltro(kardexBusqueda, bk.getFechaInicio(), bk.getFechaFinal());
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        int i = 0;
        for (Kardex kardex : listaKardex) {
            KardexFisicoTO mov = new KardexFisicoTO();
            if (i == 0) {
                i++;
                mov.setDocumento("SALDO ANTERIOR");

                mov.setFecha(UtilitarioFecha.obtenerPrimerDiaMes(kardex.getFecMovimiento()));
                mov.setSaldo(kardex.getCaStockIncial());
                mov.setUnidad(kardex.getUnidadMedida().getAbrev());
                listaMov.add(mov);

                mov = new KardexFisicoTO();
            }

            mov.setFecha(kardex.getFecMovimiento());
            if (kardex.getMotivo1().getDeCortaMotivo().length() > 20) {
                mov.setMotivo(kardex.getMotivo1().getDeCortaMotivo().substring(0, 19));
            } else {
                mov.setMotivo(kardex.getMotivo1().getDeCortaMotivo());
            }

            mov.setUnidad(kardex.getUnidadMedida().getAbrev());
            Integer tipo_comp = 0;

            if (kardex.getIdGuiaRemision() != null) {
                if (kardex.getIdGuiaRemision().getIdFactura() != null) {
                    mov.setNumero(kardex.getIdGuiaRemision().getIdFactura().getSerie() + "-" + kardex.getIdGuiaRemision().getIdFactura().getNumeroFactura());
                    tipo_comp = kardex.getIdGuiaRemision().getIdFactura().getTipoCompPago();
                    mov.setProveedor_cliente(kardex.getIdGuiaRemision().getIdFactura().getIdProveedor().getNombreComercial());
                } else {
                    mov.setNumero(kardex.getIdGuiaRemision().getSerie() + "-" + kardex.getIdGuiaRemision().getNumeroGuia());

                    if (kardex.getIdGuiaRemision().getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_ENTRADA) {
                        mov.setProveedor_cliente(kardex.getIdGuiaRemision().getSedePartida().getIdProveedor().getNombreComercial());
                    } else {
                        if (kardex.getIdGuiaRemision().getSedeLlegada().getIdProveedor() != null) {
                            mov.setProveedor_cliente(kardex.getIdGuiaRemision().getSedeLlegada().getIdProveedor().getNombreComercial());
                        } else {
                            mov.setProveedor_cliente(kardex.getIdGuiaRemision().getSedeLlegada().getIdEmpresa().getNombreComercial());
                        }

                    }

                    tipo_comp = kardex.getIdGuiaRemision().getTipoCompPago();
                }

                try {
                    mov.setDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorId(tipo_comp).getNombre());
                } catch (ServiceException e) {
                    e.printStackTrace();
                }

            } else if (kardex.getIdVentaFacturacion() != null) {
                if (kardex.getIdVentaFacturacion().getCoddocbase() == null) { //&& kardex.getIdVentaFacturacion().getTipoCompago() == TIPO_DOC_VENTA.GUIA.getValor()) {
                    mov.setNumero(kardex.getIdVentaFacturacion().getSerieFactura() + "-" + kardex.getIdVentaFacturacion().getNumFactura());
                    mov.setProveedor_cliente(kardex.getIdVentaFacturacion().getCodCliente().getNombreComercial());
                    tipo_comp = kardex.getIdVentaFacturacion().getTipoCompago();
                    /*} else if (kardex.getIdVentaFacturacion().getCoddocbase() == null && kardex.getIdVentaFacturacion().getTipoCompago() != TIPO_DOC_VENTA.GUIA.getValor()) {
                     mov.setNumero(kardex.getIdVentaFacturacion().getSerieFactura() + "-" + kardex.getIdVentaFacturacion().getNumFactura());
                     tipo_comp = kardex.getIdVentaFacturacion().getTipoCompago();*/
                } else if (kardex.getIdVentaFacturacion().getCoddocbase() != null) {
                    try {
                        VentaFacturacion venta = servicioVentaFacturacion.obtenerFacturacion(kardex.getIdVentaFacturacion().getCoddocbase());
                        mov.setNumero(venta.getSerieFactura() + "-" + venta.getNumFactura());
                        mov.setProveedor_cliente(venta.getCodCliente().getNombreComercial());
                        tipo_comp = venta.getTipoCompago();
                    } catch (ServiceException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    mov.setDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorId(tipo_comp).getNombre());
                } catch (ServiceException e) {
                    e.printStackTrace();
                }
            }



            if (kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
                mov.setEntrada(kardex.getCaMovimiento());
                bk.setCantEntradaPartida(bk.getCantEntradaPartida().add(mov.getEntrada()));

            } else {
                mov.setSalida(kardex.getCaMovimiento().negate());
                bk.setCantSalidaPartida(bk.getCantSalidaPartida().add(mov.getSalida()));

            }
            mov.setSaldo(kardex.getCaStockFinal());

            listaMov.add(mov);
        }
        if (!partida.equalsIgnoreCase(bk.getPartidaUsada())) {
            bk.setPartidaUsada(partida);
            bk.setCantEntradaArticulo(bk.getCantEntradaArticulo().add(bk.getCantEntradaPartida()));
            bk.setCantEntradaSede(bk.getCantEntradaSede().add(bk.getCantEntradaPartida()));

            bk.setCantSalidaArticulo(bk.getCantSalidaArticulo().add(bk.getCantSalidaPartida()));
            bk.setCantSalidaSede(bk.getCantSalidaSede().add(bk.getCantSalidaPartida()));


        }


        /*System.out.println("movimientos : " + listaMov);

         System.out.println("--------------------------------- Cambiar Articulo ---------------------------------------------------");*/
        return listaMov;
    }

    /**
     * ********************************* FIN KARDEX FISICO
     * *********************************************
     */
    public Collection<Articulo> buscarArticuloKardexValorizado(Sede sede) {

        Collection<Articulo> listaArticulos = new ArrayList<Articulo>();
        if (!sede.equals(bk.getSedeUsada())) {
            bk.setSedeUsada(sede);
            bk.setCantSalidaSede(BigDecimal.ZERO);
            bk.setCantEntradaSede(BigDecimal.ZERO);
            bk.setTotalSalidaSede(BigDecimal.ZERO);
            bk.setTotalEntradaSede(BigDecimal.ZERO);
        }
        bk.setArticuloUsado(new Articulo(0));
        try {
            Kardex kardexBusqueda = new Kardex();
            kardexBusqueda.setArticulo(bk.getArticuloBusqueda());
            kardexBusqueda.setId(new KardexPK(sede.getIdEmpresa().getId(), sede.getId(), bk.getKardexBusqueda().getId().getIdArticulo(),
                    0, bk.getKardexBusqueda().getId().getPartidaLote()));
            bk.setListaKardex(servicioKardex.listaKardexPorFiltro(kardexBusqueda, bk.getFechaInicio(), bk.getFechaFinal()));
            listaArticulos = obtenerArticulos(bk.getListaKardex());
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        return listaArticulos;
    }

    public Collection<String> buscarPartidasKardexValorizado(Articulo articulo) {

        if (!articulo.getId().equals(bk.getArticuloUsado().getId())) {
            bk.setArticuloUsado(articulo);
            bk.setCantSalidaArticulo(BigDecimal.ZERO);
            bk.setCantEntradaArticulo(BigDecimal.ZERO);
            bk.setTotalSalidaArticulo(BigDecimal.ZERO);
            bk.setTotalEntradaArticulo(BigDecimal.ZERO);
        }
        bk.setPartidaUsada(null);
        Collection<String> listaPartidas = new ArrayList<String>();
        listaPartidas = obtenerPartidas(bk.getListaKardex(), articulo);
        return listaPartidas;
    }

    public Collection<Articulo> obtenerArticulos(Collection<Kardex> listaKardex) {
        Collection<Articulo> listaArticulos = new ArrayList<Articulo>();
        List<Integer> listaIdArticulo = new ArrayList<Integer>();
        boolean flag;
        for (Kardex kardex : listaKardex) {
            flag = false;
            if (listaIdArticulo.contains(kardex.getId().getIdArticulo())) {
                flag = true;
                //break;
            }

            if (!flag) {
                listaIdArticulo.add(kardex.getId().getIdArticulo());
                //bk.getListaArticuloReporte().add(kardex.getArticulo());
                listaArticulos.add(kardex.getArticulo());
            }
        }
        return listaArticulos;
    }

    public Collection<String> obtenerPartidas(Collection<Kardex> listaKardex, Articulo articulo) {
        Collection<String> listaPartidas = new ArrayList<String>();
        boolean flag;
        for (Kardex kardex : listaKardex) {
            flag = false;
            if (articulo.getId().equals(kardex.getArticulo().getId())) {

                if (!listaPartidas.contains(kardex.getId().getPartidaLote())) {
                    flag = true;
                }
            } else if (listaPartidas.size() > 0) {
                break;
            }

            if (flag) {
                listaPartidas.add(kardex.getId().getPartidaLote());
            }
        }
        return listaPartidas;
    }
}
